package hotel.board;

import hotel.dice.IDice;
import hotel.exception.NotEnoughMoneyException;
import hotel.hotel.IProperty;

public interface IExtendedBoard extends IBoard {
	
	// REQUETES
	
	/**
	 * @return true si le joueur courant peut construire une entrée gratuite.
	 */
	boolean canBuildFreeEntry();
	
	/**
	 * @return true si le joueur courant peut construire un bâtiment gratuit.
	 */
	boolean canBuildFreeBuilding();
	
	/**
	 * @return true si le joueur courant peut construire des bâtiments.
	 */
	boolean canBuildBuildings();
	
	/**
	 * @return true si le joueur courant peut acheter une propriété.
	 */
	boolean canBuyProperty();
	
	/**
	 * @return le dé que le joueur courant doit lancer, null si aucun.
	 */
	IDice<Object> mustRollDice();
	
	/**
	 * @return la valeur que doit payer le joueur courant.
	 */
	long mustPay();
	
	// COMMANDES
	
	/**
	 * @throws NotEnoughMoneyException le joueur courant n'a pas assez d'argent pour payer.
	 */
	void pay() throws NotEnoughMoneyException;

	/**
	 * @return la propriété adjascente pour laquelle le joueur courant doit payer un loyer, null si aucune.
	 */
	IProperty getCurrentRentable();

}
